# 48. struct模块、hmac模块、处理TCP的粘包问题

# struct模块

struct 模块是一个可以将任意大小的数字转换成一个固定长度编码的模块0

struct模块在这里也暂时不会说太多,

  unsigned 代表无符号 
  	有符号int 和 无符号int的区别
  	有符号表示的是1个字节,8位,最高位是符号位,所以有符号的变量,一个字节表示范围:-128~127
 	无符号表示的是1个字节,8位,所有位都是数值,所以无符号的便利,一个字节表示范围:0-255

  float和double
  	float表示单精度,一般的操作系统中表示为,将数值准确到小数点后 7~8位
  	double表示双精度,一般的操作系统中表示为,将数值准确到小数点后15~16位

  void 指的是无返回值类型,在python中没有这种类型的数据
  *    表示的是一级指针,指针的意思是:指向某一块内存地址

# struct模块的简单使用说明

struct.pack(type,num)  ## 把指定的数据类型转换成固定长度的编码
# type:要转换的数据是什么类型的数据
# num:要转换的数据

struct.unpack(type,num)  ## 把固定长度的编码转换成数据
# type:要转换的许编码是什么类型的数据
# num:要转换的编码

基本用于什么场景

可以用于解决TCP在传输过程出现的粘包情况

通过统计要发送的数据的大小,使用struct模块进行编码,固定为四字节的编码,在让服务端先接收四个字节的数据,反编码得到要传输的数据大小,在按这个大小,限制接下来接收的数据的大小

这样就可以解决TCP的粘包问题

# hmac模块

这个是另一种的加密算法模块

但是他跟hashib模块的不同之处

  1. hashlib模块:加密出来是一个字符串
  2. hmac模块:加密出来是bytes类型的数据

l

# hmac模块的简单使用

md5 = hmac.new(盐,需要加密的数据)
r = md5_obj.digest()
## 这样就可以拿到加密后的密文了
## 加密的密文是用mb5算法加密的
## 注意:盐是需要bytes类型的数据

简单使用

import hmac
import os
lib = os.urandom(16)
lib_b = "howo".encode("utf-8")
md5 = hmac.new(lib_b,lib)
r = md5.digest()
print(r)

执行结果:
b'8\xf3}\xc7\xb4\xfej\xfe\xe5\x13\xc0\x85l\x8b\xb2\xc2'

# 练习题 - 进度条

import time
for i in range(51):
    time.sleep(0.2)
    print('\r'+ i*'=' + '>' + str(i*3) + '%',end='')
    
## 为什么要加上时间模块,加上时间模块,只是给大家看一下效果

# 处理TCP粘包的思路

这里只说思路,实现在下面的项目中会运用到

在准备传输数据的时候,先对数据进行序列化,在对数据进行统计,把统计结果交给struct模块进行编码,因为struct模块的编码无论是对多大的数据,编码出来的结果,都是4个字节,在把编码后的4个字节数据加上要传输的数据,传输给服务端

然后,让服务端先接收4个字节的数据,进行解码,出来客户端要传输的数据的大小,在进行接收,在接收的时候限制接收的大小

这样就可以有效的实现TCP无粘包现象